<?php

/**
 * Yii Controller AuthorizationController
 *
 * @author luubk
 * @since Jan 14, 2013 - 9:42:46 AM
 */
class AuthController extends MyController
{

    public $modelName = 'AuthItem';

    public function init()
    {
        parent::init();

        $controller           = Yii::app()->controller->id;
        // Đưa vào menu của Controller
        $this->controllerMenu = array(
            array(
                'label' => Yii::t($controller, "Permissions"),
                'url'   => $this->createUrl("$controller/permit", array(
                    'lang' => $this->lang_id,
                ))
            ),
            array(
                'label' => Yii::t($controller, "Role"),
                'url'   => $this->createUrl("$controller/index", array(
                    'lang' => $this->lang_id,
                    'type' => AuthItem::TypeRole,
                ))
            ),
            array(
                'label' => Yii::t($controller, "Operation"),
                'url'   => $this->createUrl("$controller/index", array(
                    'lang' => $this->lang_id,
                    'type' => AuthItem::TypeOperation,
                ))
            ),
            array(
                'label' => Yii::t($controller, "Task"),
                'url'   => $this->createUrl("$controller/index", array(
                    'lang' => $this->lang_id,
                    'type' => AuthItem::TypeTask,
                ))
            ),
            array(
                'label' => Yii::t($controller, "Auto load"),
                'url'   => $this->createUrl("$controller/auto", array(
                    'lang' => $this->lang_id,
                    'type' => AuthItem::TypeTask,
                ))
            ),
        );
    }

    public function actionIndex()
    {

        /**
         * Hiển thị danh sách theo loại AuthItem
         */
        $auth = Yii::app()->authManager;
//        $auth->createRole('Concierge','Conceirge roles');
//        die('xxx');
//        var_dump($auth);
//        
//        die;


        $type = isset($_GET['type']) ? $_GET['type'] : AuthItem::TypeRole;
        switch ($type)
        {
            case AuthItem::TypeRole:
                $authItems = $auth->getRoles();
                $authName  = Yii::t('auth', 'Role');
                break;
            case AuthItem::TypeOperation:
                $authItems = $auth->getOperations();
                $authName  = Yii::t('auth', 'Operation');
                break;
            case AuthItem::TypeTask:
                $authItems = $auth->getTasks();
                $authName  = Yii::t('auth', 'Task');
                break;
            default:
                break;
        }

        $this->render('index', array(
            'authItems' => $authItems,
            'type'      => $type,
            'authName'  => $authName,
        ));
    }

    protected function form($action = 'Create')
    {
        $this->model->type = $_GET['type'];
        parent::form($action);
    }

    protected function save()
    {
        if (parent::save())
        {
            $childArray = isset($_POST['child']) ? $_POST['child'] : array();
            $this->model->name;
            $auth       = Yii::app()->authManager;
            $authitem   = $auth->getAuthItem($this->model->name);

            // Lấy tất cả các phần tử con đã có
            foreach ($authitem->getChildren() as $child)
            {
                // Nếu phần tử con không tồn tại trong mảng POST thì loại bỏ
                if (!isset($childArray[$child->name]))
                    $authitem->removeChild($child->name);
                // Nếu đã tồn tại thì loại khỏi mảng POST
                else
                    unset($childArray[$child->name]);
            }

            // Các phần tử còn lại sẽ được add làm con
            if (!empty($childArray))
            {
                foreach ($childArray as $childName => $value)
                    $authitem->addChild($childName);
            }

            return TRUE;
        }
        return FALSE;
    }

    public function urlAction($action, $pk, $type)
    {
        return $this->createUrl(Yii::app()->controller->id . "/$action", array(
                    'lang' => Yii::app()->language,
                    'pk'   => $pk,
                    'type' => $type,
        ));
    }

//    public function actionPermit()
//    {
//        if (isset($_POST['parent']) && isset($_POST['child']))
//        {
//            $auth = Yii::app()->authManager;
//            $authitem = $auth->getAuthItem($_POST['parent']);
//            $status = ($authitem->hasChild($_POST['child'])) ?
//                $authitem->removeChild($_POST['child']) :
//                $authitem->addChild($_POST['child']);
//
//            if ($status)
//            {
//                $data = array(
//                    'mess' => Yii::t('form', '{action} successful!', array(
//                        '{action}' => Yii::t('auth', 'Permit'))
//                    ),
//                    'status' => 'ok'
//                );
//                die(json_encode($data));
//            }
//            else
//            {
//                $data = array(
//                    'mess' => Yii::t('form', 'Can\'t do {action} , please try again!', array(
//                        '{action}' => Yii::t('auth', 'Permit'))
//                    ),
//                    'status' => 'error'
//                );
//                die(json_encode($data));
//            }
//        }
//
//        $this->pageTitle = Yii::t('auth', "Permissions");
//        $this->render('permit');
//    }

    public function actionPermit()
    {
        $this->checkAccess();

        if (isset($_POST['role']) && isset($_POST['opera']))
        {
            $auth = Yii::app()->authManager;

            $authitem = $auth->getAuthItem($_POST['role']);

            // Xóa những phần tử không được chọn
            $child_exist = array();
            foreach ($authitem->getChildren() as $opera)
            {
                if (!in_array($opera->name, $_POST['opera']))
                    $authitem->removeChild($opera->name);
                else
                    $child_exist[] = $opera->name;
            }

            // Thêm những phần tử chưa tồn tại
            foreach ($_POST['opera'] as $opera)
            {
                if (!in_array($opera, $child_exist))
                    $authitem->addChild($opera);
            }

            $noti = Yii::t('form', '{action} successful!', array(
                        '{action}' => Yii::t('auth', 'Permit'))
            );
            Yii::app()->user->setFlash('noti', $noti);
            $this->refresh();
        }

        $this->pageTitle = Yii::t('auth', "Permissions");
        $this->render('permit');
    }

    public function actionAuto()
    {
        if (isset($_POST['auth']) && !empty($_POST['auth']))
        {
            $auth = Yii::app()->authManager;
            foreach ($_POST['auth'] as $authItem)
            {
                if ($auth->getAuthItem($authItem))
                    continue;

                $auth->createOperation($authItem, str_replace(".", " ", $authItem));
            }
        }

        $this->render('auto');
    }

}

/** 
 * End file AuthorizationController
 */
